package org.javaboy.api;

import io.seata.rm.tcc.api.BusinessActionContext;
import io.seata.rm.tcc.api.BusinessActionContextParameter;
import io.seata.rm.tcc.api.LocalTCC;
import io.seata.rm.tcc.api.TwoPhaseBusinessAction;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

@LocalTCC
public interface AccountServiceApi {

    /**
     * 扣减库存，这是一阶段要执行的方法
     * 注意，这里的返回值必须为 Boolean，因为这个方法将来执行成功还是失败需要报告给 TC
     * 返回值为 true，表示一阶段执行成功，返回值为 false，表示一阶段执行失败
     * <p>
     * 一阶段的方法，都是开发者手动调用的，但是，二阶段的方法不是开发者手动调用的，是系统根据一阶段的执行情况自动调用的
     * <p>
     * BusinessActionContext 参数是请求的上下文，这个上下文中所包含的信息贯穿整个分布式事务阶段
     *
     * @param userId
     * @param count
     * @return
     */
    @PostMapping("/account/deduce")
    @TwoPhaseBusinessAction(name = "accountServiceApi", commitMethod = "commit", rollbackMethod = "rollback")
    boolean deduceAccount(@RequestBody BusinessActionContext actionContext, @RequestParam("userId") @BusinessActionContextParameter("userId") Integer userId, @RequestParam("money") @BusinessActionContextParameter("money") Double money);

    /**
     * commit 和 rollback 是二阶段要执行的方法，在二阶段，这两个方法二选一
     *
     * @return
     */
    @PostMapping("/account/commit")
    boolean commit(@RequestBody BusinessActionContext actionContext);

    @PostMapping("/account/rollback")
    boolean rollback(@RequestBody BusinessActionContext actionContext);
}
